其他
如何解决MySQL中的死锁问题?
导读:虽然锁在一定程度上能够解决并发问题,但稍有不慎,就可能造成死锁。本文介绍死锁的产生及处理。
预防死锁:处理死锁最直接的方法就是破坏造成死锁的4个必要条件中的一个或多个,以防止死锁的发生。 避免死锁:在系统资源的分配过程中,使用某种策略或者方法防止系统进入不安全状态,从而避免死锁的发生。 检测死锁:这种方法允许系统在运行过程中发生死锁,但是能够检测死锁的发生,并采取适当的措施清除死锁。 解除死锁:当检测出死锁后,采用适当的策略和方法将进程从死锁状态解脱出来。
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account where id =1 for update;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 张三 | 300 |
+----+--------+---------+
1 row in set (0.00 sec)
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account where id =2 for update;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 2 | 李四 | 350 |
+----+--------+---------+
1 row in set (0.00 sec)
mysql> select * from account where id =2 for update;
mysql> select * from account where id =1 for update;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
show engine innodb status\G
尽量让数据表中的数据检索都通过索引来完成,避免无效索引导致行锁升级为表锁。 合理设计索引,尽量缩小锁的范围。 尽量减少查询条件的范围,尽量避免间隙锁或缩小间隙锁的范围。 尽量控制事务的大小,减少一次事务锁定的资源数量,缩短锁定资源的时间。 如果一条SQL语句涉及事务加锁操作,则尽量将其放在整个事务的最后执行。 尽可能使用低级别的事务隔离机制。
本文摘编自《深入理解分布式事务:原理与实战》,经出版方授权发布。
划重点👇
干货直达👇
更多精彩👇
在公众号对话框输入以下关键词查看更多优质内容!
读书 | 书单 | 干货 | 讲明白 | 神操作 | 手把手大数据 | 云计算 | 数据库 | Python | 爬虫 | 可视化AI | 人工智能 | 机器学习 | 深度学习 | NLP5G | 中台 | 用户画像 | 数学 | 算法 | 数字孪生
据统计,99%的大咖都关注了这个公众号👇